/**
 * Trie（发音类似 "try"）或者说 前缀树 是一种树形数据结构，用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景，例如自动补完和拼写检查。
 *
 * 请你实现 Trie 类：
 *
 * Trie() 初始化前缀树对象。
 * void insert(String word) 向前缀树中插入字符串 word 。
 * boolean search(String word) 如果字符串 word 在前缀树中，返回 true（即，在检索之前已经插入）；否则，返回 false 。
 * boolean startsWith(String prefix) 如果之前已经插入的字符串word 的前缀之一为 prefix ，返回 true ；否则，返回 false
 * 链接：https://leetcode.cn/problems/implement-trie-prefix-tree
 */
class Trie {
    private static class TrieNode {
        TrieNode[] children=new TrieNode[26];
        boolean isVal=false;
    }
    private TrieNode root;
    public Trie() {
        root=new TrieNode();
    }
    
    public void insert(String word) {
        TrieNode p=root;
        int len=word.length();
        for(int i=0;i<len;i++) {
            char c=word.charAt(i);
            if(p.children[c-'a']==null) {
                p.children[c-'a']=new TrieNode();
            }
            p=p.children[c-'a'];
        }
        p.isVal=true;
    }
    public TrieNode getNode(TrieNode node,String prefix) {
        TrieNode p=node;
        int len=prefix.length();
        for(int i=0;i<len;i++) {
            char c=prefix.charAt(i);
            if(p.children[c-'a']==null) {
                return null;
            }
            p=p.children[c-'a'];
        }
        return p;
    }
    public boolean search(String word) {
       TrieNode p=getNode(root,word);
       if(p==null||p.isVal==false) {
           return false;
       }
       return true;
    }
    
    public boolean startsWith(String prefix) {
        return getNode(root,prefix)!=null;
    }
}